#include <head.h>

void Ls(const char *file)
{
    struct stat buf;

    // 获取文件信息状态
    if (stat(file, &buf) == -1)
    {
        printf("文件信息获取失败\n");
        return;
    }
    // 打印文件类型
    // 使用 S_IFMT 掩码获取文件类型
    switch (buf.st_mode & S_IFMT)
    {
    case S_IFREG:
        printf("-");
        break;
    case S_IFDIR:
        printf("d");
        break;
    case S_IFCHR:
        printf("c");
        break;
    case S_IFBLK:
        printf("b");
        break;
    case S_IFIFO:
        printf("p");
        break;
    case S_IFLNK:
        printf("l");
        break;
    case S_IFSOCK:
        printf("s");
        break;
    default:
        printf("?");
        break;
    }

    // 打印文件权限
    printf((buf.st_mode & S_IRUSR) ? "r" : "-");
    printf((buf.st_mode & S_IWUSR) ? "w" : "-");
    printf((buf.st_mode & S_IXUSR) ? "x" : "-");
    printf((buf.st_mode & S_IRGRP) ? "r" : "-");
    printf((buf.st_mode & S_IWGRP) ? "w" : "-");
    printf((buf.st_mode & S_IXGRP) ? "x" : "-");
    printf((buf.st_mode & S_IROTH) ? "r" : "-");
    printf((buf.st_mode & S_IWOTH) ? "w" : "-");
    printf((buf.st_mode & S_IXOTH) ? "x" : "-");
    putchar(' ');

    // 打印文件连接数
    printf("%ld", buf.st_nlink);

    // 打印文件所属主
    struct passwd *pw = getpwuid(buf.st_uid);
    printf(" %s", pw->pw_name);

    // 打印文件所属组
    struct group *gr = getgrgid(buf.st_gid);
    printf(" %s", gr->gr_name);

    // 打印文件大小
    printf(" %6ld", buf.st_size);

    // 打印上次修改时间
    struct tm *file_tm = localtime(&buf.st_mtime);
    printf("  %d月", file_tm->tm_mon + 1);
    printf(" %d", file_tm->tm_mday);
    printf(" %d:%d", file_tm->tm_hour, file_tm->tm_min);

    // 打印文件名
    printf(" %s\n", file);
}

int main(int argc, char const *argv[])
{
    // 打开目录
    DIR *dir = opendir("../");
    DIR_ERR(dir);

    // 读取目录
    struct dirent *read_dir;
    while ((read_dir = readdir(dir)) != NULL)
    {
        // 调用Ls函数
        Ls(read_dir->d_name);
    }

    return 0;
}
